﻿using Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BLL
{
    public class Salario_BLL
    {
        #region singleton
        private static Salario_BLL instance;

        private Salario_BLL() { }

        public static Salario_BLL Instance
        {
            get
            {
                if (instance == null)
                {
                    instance = new Salario_BLL();
                }
                return instance;
            }
        }
        #endregion


        public hrp_contratos contratoFuncionario(int id_funcionario)
        {
            hrpEntities hrp = new hrpEntities();
            var contratos = from contrato in hrp.hrp_contratos
                            where contrato.id_funcionario == id_funcionario && contrato.activo == true
                            select contrato;


            return contratos.FirstOrDefault();
        }

        public hrp_salario salarioFuncionario(int id_funcionario)
        {
            hrpEntities hrp = new hrpEntities();
            var salario = from salarios in hrp.hrp_salario
                          where salarios.id_funcionario == id_funcionario && salarios.activo == true
                          select salarios;


            return salario.FirstOrDefault();
        }

        public hrp_contratos actualizarContrato(int id_funcionario, DateTime inicioContrato,
            DateTime fimContrato, int newUrl, string user_id, string user_ip)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_contratos_log log = new hrp_contratos_log();
            hrp_contratos contractoActual = (from contrato in hrp.hrp_contratos
                                             where contrato.id_funcionario == id_funcionario && contrato.activo == true
                                             select contrato).First();
            DateTime now = DateTime.Now;
            log.activo = contractoActual.activo;
            log.data_fim = contractoActual.data_fim;
            log.data_inicio = contractoActual.data_inicio;
            log.id_cliente = contractoActual.id_cliente;
            log.id_empresa = contractoActual.id_empresa;
            log.id_funcionario = contractoActual.id_funcionario;
            log.log_user_id = user_id;
            log.log_user_ip = user_ip;
            log.log_user_timestamp = now;
            log.user_ip = contractoActual.user_ip;
            log.user_id = contractoActual.user_id;
            log.user_timestamp = contractoActual.user_timestamp;
            log.id_contrato = contractoActual.id;
            log.url_contrato = contractoActual.url_contrato;

            hrp.hrp_contratos_log.Add(log);
            contractoActual.data_fim = fimContrato;
            contractoActual.data_inicio = inicioContrato;
            contractoActual.user_id = user_id;
            contractoActual.user_ip = user_ip;
            contractoActual.user_timestamp = now;
            contractoActual.url_contrato = newUrl;

            hrp.SaveChanges();
            return contractoActual;

        }

        public void actualizarSalario(hrp_contratos contractoActual, decimal salario,
            string user_id, string user_ip, decimal sub_alimentacao, decimal sub_produtividade, decimal sub_desempenho,
            decimal sub_assiduidade, decimal sub_transporte, decimal sub_turno, decimal abono, decimal abono_familia, decimal chefia,
            decimal subs_10, decimal subs_exposicao, decimal subs_contagio, decimal subs_compensacao, decimal sindicato,
            decimal subs_natal,decimal subs_ferias)
        {
            hrpEntities hrp = new hrpEntities();
            DateTime now = DateTime.Now;
            hrp_salario_log log = new hrp_salario_log();
            hrp_salario salarioActual = (from salarios in hrp.hrp_salario
                                         where salarios.id_funcionario == contractoActual.id_funcionario && salarios.activo == true
                                         select salarios).FirstOrDefault();
            log.activo = salarioActual.activo;
            log.id_salario = salarioActual.id;
            log.id_cliente = salarioActual.id_cliente;
            log.id_empresa = salarioActual.id_empresa;
            log.id_funcionario = salarioActual.id_funcionario;
            log.iso_pais = salarioActual.iso_pais;
            log.log_user_id = user_id;
            log.log_user_ip = user_ip;
            log.log_user_timestamp = now;
            log.moedaShort = salarioActual.moedaShort;
            log.pais = salarioActual.pais;
            log.salario = salarioActual.salario;
            log.user_id = salarioActual.user_id;
            log.user_ip = salarioActual.user_ip;
            log.user_timestamp = salarioActual.user_timestamp;
            log.id_contrato = salarioActual.id_contrato;
            log.sub_alimentacao = salarioActual.sub_alimentacao;
            log.sub_produtividade = salarioActual.sub_produtividade;
            log.sub_desempenho = salarioActual.sub_desempenho;
            log.sub_transporte = salarioActual.sub_transporte;
            log.abono = salarioActual.abono;
            log.abono_familia = salarioActual.abono_familia;
            log.chefia = salarioActual.chefia;
            log.sub10 = salarioActual.sub10;
            log.sub_exposicao = salarioActual.sub_exposicao;
            log.sub_contagio = salarioActual.sub_contagio;
            log.sub_compensacao = salarioActual.sub_compensacao;
            log.subs_ferias = salarioActual.subs_ferias;
            log.subs_natal = salarioActual.subs_natal;

            hrp.hrp_salario_log.Add(log);

            salarioActual.user_id = user_id;
            salarioActual.user_ip = user_ip;
            salarioActual.user_timestamp = now;
            salarioActual.salario = salario;
            salarioActual.id_contrato = contractoActual.id;
            salarioActual.sub_alimentacao = sub_alimentacao;
            salarioActual.sub_produtividade = sub_produtividade;
            salarioActual.sub_desempenho = sub_desempenho;
            salarioActual.sub_assiduidade = sub_assiduidade;
            salarioActual.sub_transporte = sub_transporte;
            salarioActual.sub_turno = sub_turno;
            salarioActual.abono_familia = abono_familia;
            salarioActual.abono = abono;
            salarioActual.chefia = chefia;
            salarioActual.sub10 = subs_10;
            salarioActual.sub_exposicao = subs_exposicao;
            salarioActual.sub_contagio = subs_contagio;
            salarioActual.sub_compensacao = subs_compensacao;
            salarioActual.sindicato = sindicato;
            salarioActual.subs_natal = subs_natal;
            salarioActual.subs_ferias = subs_ferias;
            
            hrp.SaveChanges();
        }

        public hrp_contratos CriarNovoContrato(int id_cliente, int id_empresa, int id_funcionario,
            DateTime inicioContrato, DateTime fimContrato, int url, string user_id, string user_ip)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_contratos contrato = new hrp_contratos();
            contrato.activo = true;
            contrato.data_fim = fimContrato;
            contrato.data_inicio = inicioContrato;
            contrato.id_cliente = id_cliente;
            contrato.id_empresa = id_empresa;
            contrato.id_funcionario = id_funcionario;
            contrato.url_contrato = url;
            contrato.user_id = user_id;
            contrato.user_ip = user_ip;
            contrato.user_timestamp = DateTime.Now;

            hrp.hrp_contratos.Add(contrato);
            hrp.SaveChanges();
            return contrato;
        }
        public hrp_salario CriarNovoSalario(int id_cliente, int id_empresa, int id_funcionario, int id_contrato, decimal valorSalario,
             int iso_pais, string moeda, string pais, string user_id, string user_ip, decimal sub_alimentacao, decimal sub_produtividade,
            decimal sub_desempenho, decimal sub_assiduidade, decimal sub_transporte, decimal sub_turno, decimal abono, decimal abono_familia, decimal chefia,
            decimal subs_10, decimal subs_exposicao, decimal subs_contagio, decimal subs_compensacao, decimal sindicato,
            decimal subs_natal, decimal subs_ferias)
        {
            hrpEntities hrp = new hrpEntities();
            hrp_salario salario = new hrp_salario();
            salario.activo = true;
            salario.id_contrato = id_contrato;
            salario.iso_pais = iso_pais;
            salario.moedaShort = moeda;
            salario.pais = pais;
            salario.salario = valorSalario;
            salario.id_cliente = id_cliente;
            salario.id_empresa = id_empresa;
            salario.id_funcionario = id_funcionario;
            salario.user_id = user_id;
            salario.user_ip = user_ip;
            salario.user_timestamp = DateTime.Now;
            salario.sub_alimentacao = sub_alimentacao;
            salario.sub_produtividade = sub_produtividade;
            salario.sub_desempenho = sub_desempenho;
            salario.sub_assiduidade = sub_assiduidade;
            salario.sub_transporte = sub_transporte;
            salario.sub_turno = sub_turno;
            salario.abono = abono;
            salario.abono_familia = abono_familia;
            salario.chefia = chefia;


            salario.sub10 = subs_10;
            salario.sub_exposicao = subs_exposicao;
            salario.sub_contagio = subs_contagio;
            salario.sub_compensacao = subs_contagio;
            salario.sindicato = sindicato;
            
            salario.subs_ferias = subs_ferias;
            salario.subs_natal = subs_natal;


            hrp.hrp_salario.Add(salario);
            hrp.SaveChanges();
            return salario;
        }

        public List<hrp_salarios_funcionarios> ListaFuncionariosEmpresa(int id_empresa)
        {
            hrpEntities hrp = new hrpEntities();
            var salariosFuncionarios = from salarioFuncionario in hrp.hrp_salarios_funcionarios
                                       where salarioFuncionario.id_empresa == id_empresa
                                       select salarioFuncionario;

            return salariosFuncionarios.ToList();
        }

        public bool salariosCriadosParaEsseMes(string ano, string mes, int id_empresa)
        {
            hrpEntities hrp = new hrpEntities();
            var salarioCriado = from salariosCriados in hrp.hrp_facturacao
                                where salariosCriados.mes_referente == mes
                                && salariosCriados.ano_referente == ano
                                && salariosCriados.id_empresa == id_empresa
                                select salariosCriados;

            return salarioCriado.Any();
        }


       
    }
}
